#ifndef HATERH_HLOG_H_
#define HATERH_HLOG_H_

namespace Zen 
{
namespace utility
{
#include <iostream>
#include <boost/thread/win32/mutex.hpp>
using namespace boost;
/* The reason why we use template, is to create an unique global lock for each
ostream object */
template<ostream& os>
class HLog
{
public:
    HLog(bool bHasTime)
    {
        _GetMutex().lock();
        if (bHasTime)
            os << GetCurTime() << " - ";
    }

	HLog(int file)
	{
		_GetMutex().lock();
		os << GetCurTime() << " - ";

	}

    ~HLog()
    { 
        _GetMutex().unlock();
    }

    operator ostream& ()
    {
        return os;
    }

private:
    /*inline*/ mutex& _GetMutex()
    { 
        static mutex m;
        return m;
    }
};

//template<ostream& os>
//class base_log : public ostream
//{
//public:
//	base_log()
//		: ostream(os.rdbuf())
//	{
//		get_mutex_().lock();
//	}
//
//	~base_log()
//	{
//		get_mutex_().unlock();
//	}
//
//private:
//	inline mutex& get_mutex_()
//	{
//		static mutex m2;
//		return m2;
//	}
//};

}
} // namespace Zen

#endif // HATERH_HLOG_H_